import re

from bs4 import BeautifulSoup


def has_class_but_no_id(tag):
    """
    元素具有class 属性但是没有 id 属性
    :param tag:
    :return: 满足条件返回 True， 否则返回 False
    """
    return tag.has_attr("class") and not tag.has_attr('id')


if __name__ == '__main__':
    file = open(file="The Dormouse's story.html", mode="r", encoding="utf-8")
    html = file.read()
    file.close()

    # print(html)

    soup = BeautifulSoup(html, "html.parser")

    # # 通过标签名称进行查找，并返回第一个匹配的结果
    # result = soup.find(name="p")
    # print(result)
    #
    # result = soup.find(name="a")
    # print(result)

    # # class 是 Python 语言中的关键词，不能直接使用。用 class_ 进行替代
    # result = soup.find(class_= "title")
    # print(result)
    #
    # # find_all 查找所有的元素内容，并且返回列表
    # result = soup.find_all(class_="story")
    # print(result)
    #
    # result = soup.find_all(href="http://example.com/elsie")
    # print(result)

    # # 使用正则表达式进行标签名称的匹配
    # # 以 b 开头的字符串
    # ele = re.compile("^b")
    # result = soup.find_all(name=ele)
    # print(result)

    # # 通过列表查找多个内容,表示的是 或 的关系
    # result = soup.find_all(name=['body', 'title'])
    # print(result)

    # # 多个选项之间表示的是 与 的关系
    # result = soup.find_all(class_='title', name='p')
    # print(result)

    # 当 传入 True 获取所有的内容
    # result = soup.find_all(name=True)
    # print(result)

    # result = soup.find_all(id=True)
    # print(result)
    #
    # result = soup.find_all(href=True)
    # print(result)

    # # 利用自定义函数进行匹配
    # result = soup.find_all(has_class_but_no_id)
    # print(result)

    # 其它使用方法
    # result = soup.find_all(attrs={"class": "title"})
    # print(result)
    # # 多个条件同时查找
    # result = soup.find_all(attrs={"id": "link2", "class": "sister"})
    # print(result)

    # # 指定返回结果的个数
    # result = soup.find_all(name='a', limit=2)
    # print(result)

    # 设置非递归式查找，即只查看第一层信息
    result = soup.find_all(name='p', recursive=False)
    print(result)
